package org.abc.fund.service.strategy.validator.WeightSum;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import org.abc.fund.service.strategy.request.create_strategy.StrategyComponentRequest;
import org.springframework.stereotype.Component;

import java.math.BigDecimal;
import java.util.List;

/** CheckWeightSum 注解的验证器实现 */
public class WeightSumValidator
    implements ConstraintValidator<WeightSum, List<StrategyComponentRequest>> {

  @Override
  public boolean isValid(
      List<StrategyComponentRequest> components, ConstraintValidatorContext context) {
    // 如果列表为空或为 null，我们认为它是有效的，
    // 可以由 @NotEmpty 或 @Size 注解来处理非空校验。
    if (components == null || components.isEmpty()) {
      return true;
    }

    // 使用 BigDecimal 进行精确计算，避免浮点数精度问题
    BigDecimal totalWeight =
        components.stream()
            .map(StrategyComponentRequest::getWeight) // 提取每个对象的 weight 属性
            .reduce(BigDecimal.ZERO, BigDecimal::add); // 将所有 weight 相加

    // 检查总和是否等于 100。使用 compareTo 进行比较。
    return totalWeight.compareTo(new BigDecimal("100.00")) == 0;
  }
}
